|
A stencil buffer is an extra buffer, in addition to the ''color buffer'' (pixel buffer) and ''depth buffer'' (z-buffering) found on modern graphics hardware. The buffer is per pixel, and works on integer values, usually with a depth of one byte per pixel. The depth buffer and stencil buffer often share the same area in the RAM of the graphics hardware. In the simplest case, the stencil buffer is used to limit the area of rendering (stenciling). More advanced usage of the stencil buffer makes use of the strong connection between the depth buffer and the stencil buffer in the rendering pipeline. For example, stencil values can be automatically increased/decreased for every pixel that fails or passes the depth test. The simple combination of depth test and stencil modifiers make a vast number of effects possible (such as shadows, outline drawing or highlighting of intersections between complex primitives) though they often require several rendering passes and, therefore, can put a heavy load on the graphics hardware. The most typical application is still to add shadows to 3D applications. It is also used for planar reflections. Other rendering techniques, such as portal rendering, use the stencil buffer in other ways; for example, it can be used to find the area of the screen obscured by a portal and re-render those pixels correctly. The stencil buffer and its modifiers can be accessed in computer graphics APIs like OpenGL and Direct3D. ==OpenGL== Test: ( ref & mask ) func (stencilValue & mask) Depending on the three possible conditions of stencil function/depth function. 1. Stencil Test Function fails: If say func is GL_NEVER, the stencil test will always fail. Neither Color/Depth buffers are modified. Stencil buffer is modified as per glStencilOp fail. If say glStencilOp(GL_REPLACE, GL_KEEP, GL_KEEP) then GL_REPLACE takes place and stencilValue = (ref & stencilMask) // will become ref 2. Stencil Test Function passes/Depth Test Function fails: If say func is GL_ALWAYS, the stencil test will always pass, but depth test may fail. Neither Color/Depth buffer are modified. Stencil buffer is modified as per glStencilOp zfail. If say glStencilOp(GL_KEEP, GL_INCR, GL_KEEP) then GL_INCR takes place and stencilValue = (stencilValue+1) // will become 1 3. Stencil Function passes/Depth Function passes: If say func is GL_ALWAYS, the stencil test will always pass. If depth test also passes. Both Color/Depth buffer are modified. Stencil buffer is modified as per glStencilOp zpass. If say, glStencilOp(GL_KEEP, GL_KEEP, GL_KEEP) then Stencil values are not changed, only Color and Depth buffers are modified. Typically Stencil buffer is initialized by setting depth buffer and color buffer masks to false. and then setting appropriate ref value to stencil buffer by failing the stencil test every time. Now use the initialized stencil buffer and stencil test to write only in the locations where stencil value is 1 抄文引用元・出典: フリー百科事典『 ウィキペディア(Wikipedia)』 ■ウィキペディアで「Stencil buffer」の詳細全文を読む スポンサード リンク
|